#include <Ogre.h>
#include <OIS/OIS.h>
#include <fstream>

#define STAGE 1 << 0
#define BOTON 1 << 1

#define ROJO     0
#define VERDE    1
#define AZUL     2
#define AMARILLO 3

#define TIMEOFF  0.25
#define TIMEON   0.5

using namespace std;
using namespace Ogre;

enum State {Menu, Game, Record, Extra};

class MyFrameListener : public Ogre::FrameListener
{
  private:
    OIS::InputManager* _inputManager;
    OIS::Keyboard* _keyboard;
    OIS::Mouse* _mouse;
    Ogre::Camera* _camera;
    Ogre::OverlayManager* _overlayManager;
    Ogre::SceneManager* _sceneManager;
    Ogre::RenderWindow* _win;
    Ogre::SceneNode* _cameraNode;

    Ogre::SceneNode* _selectedNode;

    Ogre::RaySceneQuery* _raySceneQuery;
    Ogre::Ray setRayQuery(int, int, Ogre::uint32);

    bool _mousePushed;
    State _state;
    
    // Variables de control del juego
    std::vector<int> *_sec;   // Vector con la secuencia de colores
    int _n;                   // Indice actual de la secuencia
    int _gameState;           // Control del estado del juego
    int _color;               // Valor numerico del color
    Ogre::String *_colorStr;  // Nombre del color
    Ogre::Entity *_colorEnt;  // Entidad del color
    Real _timer;              // Contador de tiempo
    Real _puntos;             // Puntuacion
    std::list<int> *_records; // Lista de records

  public:
    MyFrameListener(Ogre::RenderWindow*, Ogre::Camera*, Ogre::OverlayManager*, Ogre::SceneManager*);
    ~MyFrameListener();
    bool frameStarted(const Ogre::FrameEvent&);  
    bool menu(const Ogre::FrameEvent&);  
    bool juego(const Ogre::FrameEvent&);
    void reiniciarJuego();
    void guardarRecords();
    bool records(const Ogre::FrameEvent&);
    bool extras(const Ogre::FrameEvent&);
};
